﻿#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
//操作符详解
//算数操作符+	-	%(两个操作数都必须是整数)	/(整数除法，浮点数除法)
//略

//移位操作符（左移<<，右移>>）
//移位操作符的操作数只能是整数
//数据在计算机内存中以二进制数形式进行存储的,移位操作符是对数值的二进制位进行操作
//<1>正数的原码，反码，补码都相同	
//<2>负数的反码是将本身的原码1换0，0换1
//<3>负数的补码是反码+1

//左移（左侧第一位舍弃，右侧补0）可以等价为×2
//int main()
//{
//	int i = 10;//4个字节，32个比特位
//	//00000000000000000000000000001010
//	//00000000000000000000000000010100	20
//	i = i << 1;
//	printf("%d\n", i);
//	return 0;
//}

//右移	可以等价为÷2
//<1>算数右移(左侧用符号位补全)	<2>逻辑右移(左侧用0补全)
//int main()
//{
//	int i = -1;
//	i = i >> 1;
//	//符号位 - 为1， + 为0
//	//100000000000000000000000000000001	原码	-1
//	//111111111111111111111111111111110	反码
//	//111111111111111111111111111111111	补码（对补码进行操作）
//	//算数右移
//	//111111111111111111111111111111111	补码（右移1位，用符号位补上）
//	//111111111111111111111111111111110	反码
//	//100000000000000000000000000000001	原码
//
//	//逻辑右移
//	//101111111111111111111111111111111	补码
//	//101111111111111111111111111111110	反码（补码-1）
//	//110000000000000000000000000000001	原码	-(2^32+1)
//	printf("%d\n", i);//-1
//	return 0;
//}

//位操作符（&，|，^）
// &按位与，|按位或，^按位异或(相同为0，不同为1)
//操作数必须是整数
//int main()
//{
//	int num1 = 1;
//	int num2 = 2;
//	//00000000000000000000000000000001
//	//00000000000000000000000000000010
//	int a = num1 & num2;
//	//00000000000000000000000000000000	(0)
//	int b = num1 | num2;
//	//00000000000000000000000000000011	(3)
//	int c = num1 ^ num2;
//	//00000000000000000000000000000011	(3)
//	printf("%d %d %d\n", a, b, c);
//	return 0;
//}

//面试题（位操作符）
//不使用第三个，实现两个数的交换
//int main()
//{
//	int a = 2;
//	int b = 3;
//	//00000000000000000000000000000010	a
//	//00000000000000000000000000000011	b
//	a = a ^ b;
//	//11111111111111111111111111111110
//	b = a ^ b;
//	//00000000000000000000000000000010
//	a = a ^ b;
//	//00000000000000000000000000000011
//	printf("a = %d b = %d\n", a, b);
//	return 0;
//}

//求一个整数在内存中存储二进制中1的个数
//方法一：
//int main()
//{
//	int a;//直接打印，err，需初始化
//	while (scanf("%d", &a) == 1)//测试数据具有代表性
//	{
//		int count = 0;
//		while (a)
//		{
//			if (a % 2 == 1)//操作数不能为负
//			{
//				count++;
//			}
//				a = a / 2;//相当于每次右移1位
//		}
//		printf("二进制中1的个数 = %d\n", count);
//	}
//	return 0;
//}

//方法二：
//int main()
//{
//	int num = -1;//111111111111111111111111111111111
//	int i = 0;
//	int j = 0;
//	while (scanf("%d", &i) == 1)
//	{
//		int count = 0;
//		for (j = 0; j < 32; j++)//整形
//		{
//			if (num & i)//左移32次，按位与，若数字中还存在1则并不为0
//			{
//				count++;
//			}
//			i = 1 << i;
//		}
//		printf("二进制中1的个数 = %d\n", count);
//	}
//	return 0;
//}

//将输入数据与负一（每一个比特位上都为1）按位与，最后数据与负一按位与后为0循环结束。err
// （输入数据为1）
//类型位整形，数据占据内存32个比特位，一个对比参数，每次将1左移一个比特位，逐位按位与。
//int main()
//{
//	int num = 0;//输入
//	int i = 0;
//	while (scanf("%d", &num) == 1)
//	{
//		int count = 0;
//		for (i = 0; i < 32; i++)//
//		{
//			if (num & (1 << i))//
//			{
//				count++;
//			}
//		}
//		printf("二进制中1的个数 = %d\n", count);
//	}
//	return 0;
//}

//int main()
//{
//	int num = 10;
//	int i = 1;
//	int j = 0;
//	int count = 0;
//	while (j < 32)
//	{
//		if (num & i)
//		{
//			count++;
//		}
//		i = 1 << i;
//		j++;
//	}
//	printf("%d\n", count);//7
//	return 0;
//}

//int main()
//{
//	int a = 0;
//	int b = 0;
//	int n = 1;
//	int m = 0;
//	for (a = 1; a <= 3; a++)
//	{
//		for (b = 1; b <= a; b++)
//		{
//			n = n * b;
//		}
//		m = m + n;
//		n = 1;
//	}
//	printf("%d\n", m);
//
//	return 0;
//}


//int main()
//{
//	int a = 0;
//	int b = 0;
//	int n = 1;
//	int m = 0;
//	for (a = 1; a <= 10; a++)
//	{
//		n = n * a;
//		m = m + n;
//	}
//
//	return 0;
//}

//int main()
//{
//	int a = 0;
//	int b = 0;
//	int sum = 0;
//	for (a = 1; a < 10; a++)
//	{
//		for (b = 1; b <= a; b++)
//		{
//			sum = a * b;
//			printf("%2d*%2d=%2d ", a, b, sum);
//			if (b == a)
//			{
//				printf("\n");
//			}
//		}
//	}
//	return 0;
//}


//求10个整数中的最大值
//int main()
//{
//	//输入十个数
//	// 其中有大小相等的数
//	//char arr[3] = { 0 };
//	int arr[10] = { 15,25,77,92,63,55,100,23,190,103 };
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	printf("%d\n", sz);
//	//printf("请输入3个数>:");
//	//scanf("%s", arr);
//	//冒泡排序
//	//10，9，8，7，6，5，4，3，2，1
//	int max = 0;
//	int min = 0;
//	for (max = 1, min = 0; max < sz; max++, min++)
//	{
//		if (arr[min] > arr[max])
//		{
//			int tmp = 0;
//			tmp = arr[max];
//			arr[max] = arr[min];
//			arr[min] = tmp;
//		}
//	}
//	printf("%d\n", arr[min]);
//
//	return 0;
//}

//计算1/1-1/2+1/3-1/4+1/5 …… + 1/99 - 1/100 的值，打印出结果
//int main()
//{
//	float n = 0.0;//精度丢失
//	//int sum = 0;
//	double sum = 0.0;
//	//int m = 0;
//	int m = 1;
//	for (n = 1; n <= 100; n++)
//	{
//		//m = 1;
//		sum = sum + (m / n);
//		m = m * (-1);
//	}
//	//printf("%d\n", sum);
//	printf("%lf\n", sum);
//
//	return 0;
//}

//编写程序 数一下 1到 100 的所有整数中出现多少个数字9
//int main()
//{
//	int n = 0;
//	int m = 0;
//	for (n = 1; n <= 100; n++)
//	{
//		if (n % 10 == 9)
//		{
//			m++;
//		}
//		else if (n / 10 == 9)
//		{
//			m++;
//		}
//	}
//	printf("9一共出现了%d次\n", m);
//	return 0;
//}

//二分查找
//编写代码在一个整形有序数组中查找具体的某个数
//要求：找到了就打印数字所在的下标，找不到则输出：找不到。
//int main()
//{
//	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
//	//              1,2,3,4,5,6,8,9,10,11
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	int left = 0;
//	int right = sz - 1;
//	int mid = 0;
//	int flag = 0;
//	while (left <= right)
//	{
//		mid = (left + right) / 2;
//		if (arr[mid] == 7)
//		{
//			printf("找到了，下标是%d\n", mid);
//			flag = 1;
//			break;
//		}
//		else if(arr[mid] < 7)
//		{
//			left = mid + 1;
//		}
//		else if (arr[mid] > 7)
//		{
//			right = mid - 1;
//		}
//	}
//	if (flag == 0)
//	{
//		printf("没找到\n");
//	}
//
//	return 0;
//}

//int main()
//{
//	int n = 0;
//	int m = 0;
//	for (n = 1; n <= 100; n++)
//	{
//		if (n % 10 == 9)
//		{
//			m++;
//		}
//		if (n / 10 == 9)
//		{
//			m++;
//		}
//	}
//	printf("9一共出现了%d次\n", m);
//	return 0;
//}